package br.com.virtual.base.controller.util;

import java.io.IOException;
import java.io.Serializable;

import javax.ejb.EJB;
import javax.el.ELContext;
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.virtual.base.enums.TipoPessoaEnum;
import br.com.virtual.base.enums.TipoUsuarioEnum;
import br.com.virtual.base.service.AutenticacaoService;
import br.com.virtual.base.uteis.VirtualConstants;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.model.PessoaFisica;
import br.com.virtual.cadastrar.model.PessoaJuridica;
import br.com.virtual.cadastrar.model.Usuario;

public class VirtualMB implements Serializable, VirtualConstants {

	/*
	 * ATTRIBUTES
	 */
	private static final long serialVersionUID = 1L;
	protected String linkRetorno = null;
	private Usuario usuarioLogado;

	@EJB
	protected AutenticacaoService autenticacaoService;

	/*
	 * METHODS
	 */

	public boolean hasUsuarioAutenticado(){
		
		return this.autenticacaoService.hasUsuarioAutenticado();
	}
	
	protected String redirectToLoginPage() {
		return this.redirect("/autenticar/autenticar.jsf?faces-redirect=true");
	}
	
	protected String redirectToIndex() {
		return this.redirect("/index.jsf?faces-redirect=true");
	}

	protected String redirectToCarrinhoPage() {
		return this.redirect("/vender/carrinho.jsf?faces-redirect=true");
	}

	public boolean permissaoAdministrador() {

		if (isAdministrador())
			return true;
		else
			redirect("/index.jsf");

		return false;

	}
	
	public void verificaAutenticacao(){
		if (!this.autenticacaoService.hasUsuarioAutenticado())
			this.autenticacaoService.redirectToLogin();
	}

	private String redirect(String to) {

		try {

			FacesContext context = FacesContext.getCurrentInstance();
			context.getExternalContext().redirect(to);

		} catch (IOException e) {
			e.printStackTrace();
		}

		return to;
	}

	protected boolean isNull(Object object){
		
		return object == null;
	}
	
	protected void setFlash(String key, Object value) {

		FacesContext.getCurrentInstance().getExternalContext().getFlash()
				.put(key, value);
	}

	protected Object getFlash(String key) {
		return FacesContext.getCurrentInstance().getExternalContext()
				.getFlash().get(key);
	}

	protected void addFacesMessage(String message,
			FacesMessage.Severity severity, String msgAtualizar) {

		FacesContext.getCurrentInstance().addMessage(msgAtualizar,
				new FacesMessage(severity, message, ""));

		FacesContext.getCurrentInstance().getExternalContext().getFlash()
				.setKeepMessages(true);
	}

	protected String getRequestValue(String value) {

		return (String) FacesContext.getCurrentInstance().getExternalContext()
				.getRequestParameterMap().get(value);
	}

	public Object getManagedBean(String beanName) {
		FacesContext fc = FacesContext.getCurrentInstance();
		Object bean;
		try {
			ELContext elContext = fc.getELContext();
			bean = elContext.getELResolver()
					.getValue(elContext, null, beanName);
		} catch (RuntimeException e) {
			throw new FacesException(e.getMessage(), e);
		}

		if (bean == null) {
			throw new FacesException(
					"Managed bean with name '"
							+ beanName
							+ "' was not found. Check your faces-config.xml or @ManagedBean annotation.");
		}

		return bean;
	}
	
	public String getNomeClienteToSession(Pessoa pessoa) {

		if (pessoa != null) {
			if (pessoa.getTipoPessoa().equals(TipoPessoaEnum.FISICA)) {

				PessoaFisica pf = (PessoaFisica) pessoa;
				if (pf.getApelido() == null || pf.getApelido().isEmpty())
					return pf.getNome();
				else
					return pf.getApelido();
			} else if (pessoa.equals(TipoPessoaEnum.JURIDICA)) {

				PessoaJuridica pj = (PessoaJuridica) pessoa;
				return pj.getContato();
			}

		}

		return "";
	}

	/*
	 * GETTERS AND SETTERS
	 */

	public String getLinkRetorno() {
		return linkRetorno;
	}

	public void setLinkRetorno(String linkRetorno) {
		this.linkRetorno = linkRetorno;
	}

	public AutenticacaoService getAutenticacaoService() {
		return autenticacaoService;
	}

	public void setAutenticacaoService(AutenticacaoService autenticacaoService) {
		this.autenticacaoService = autenticacaoService;
	}

	public Usuario getUsuarioLogado() {

		if (this.autenticacaoService.hasUsuarioAutenticado())
			this.usuarioLogado = this.autenticacaoService.usuarioAutenticado();
		else
			this.usuarioLogado = null;

		return usuarioLogado;
	}

	public boolean isAdministrador() {

		this.getUsuarioLogado();
		if (this.usuarioLogado != null
				&& this.usuarioLogado.getTipoUsuario().equals(
						TipoUsuarioEnum.ADMINISTRADOR))
			return true;

		return false;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	public void setSession(String name, Object value) {

		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);

		session.setAttribute(name, value);
	}

	public Object getSession(String name) {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);

		return session.getAttribute(name);
	}
}